﻿#pragma once

#include "Public.h"

// 自动控制算法模型
class AutoPilot
{
public:
    // 构造函数
    AutoPilot();

    // 析构函数
    ~AutoPilot();

    // 程序控制状态
    enum PhaseType
    {
        // 起飞模式
        TakeOff = 0,

        // 巡航模式
        Cruise,

        // 降落模式
        Landing,
    };

    // 输入端口列表
    struct Input
    {
        // 仿真时间 s
        double time;

        // 地理位置 经纬高 [longitude, latitude, altitude] [deg, deg, m]
        ASL::Vector LLA;

        // 飞行速度 导航系 [X, Y, Z] m
        ASL::Vector vNav;

        // 姿态角 YZX [gamma, psi, zeta] deg
        ASL::Vector eular;

        // 姿态角速度 机体系 [X, Y, Z] deg/s
        ASL::Vector omega;

        // 起落架触地状态 0/1
        bool groundReaction;
    };

    // 输出端口列表
    struct Output
    {
        // 起落架位置操纵指令 0/1
        int gearCommand;

        // 起落架转向操纵指令 -1~+1
        double steerCommand;

        // 起落架刹车操纵指令 0~+1
        double brakeCommand;

        // 副翼操纵指令 -1~+1
        double aileronCommand;

        // 方向舵操纵指令 -1~+1
        double rudderCommand;

        // 升降舵操纵指令 -1~+1
        double elevatorCommand;

        // 减速板操纵指令 0/1
        int speedBrakeCommand;

        // 推力控制指令 0~1
        double throttleCommand;
    };

    // 参数端口列表
    struct Parameter
    {
    };

public:
    // 初始化函数
    bool initialize(void);

    // 单步运行函数
    bool step(void);

public:
    // 输入端口对象
    AutoPilot::Input input;

    // 输入端口对象
    AutoPilot::Output output;

    // 参数端口对象
    AutoPilot::Parameter parameter;

private:
    // 程序控制算法
    void takeOff(void);
    void cruise(void);
    void landing(void);

    // 程序控制状态
    int vPhase;

    // 控制时间指针
    double vTime;

    // 控制指令标识
    bool vLanding;
    bool vBrake;
    bool vTurn;
};

// 典型飞行器运动学仿真工程
class AircraftSimulation
{
public:
    // 构造函数
    AircraftSimulation();

    // 析构函数
    ~AircraftSimulation();

    // 准备函数
    bool setup(void);

    // 初始化函数
    bool initialize(std::string resourceDir);

    // 单步运行函数
    bool step(void);

private:
    // 仿真开始时间 s
    double startTime;

    // 仿真停止时间 s
    double stopTime;

    // 仿真计算步长 s
    double stepSize;

    // 当前仿真时间 s
    double currentTime;

    // 当前仿真周期计数
    int currentCount;

    // 飞行器系统数学模型
    ASL::Mass cMassModel;
    ASL::AeroDynamic cAeroModel;
    ASL::Turbine cTurbineModel;
    ASL::ControlSystem cControlModel;
    ASL::LandingGear cLandingGearModel;
    ASL::Actuator cAileronActutor;
    ASL::Actuator cRudderActutor;
    ASL::Actuator cElevatorActutor;
    ASL::Actuator cLeadingActutor;
    ASL::Actuator cTrailingActutor;
    ASL::Actuator cSpeedActutor;

    // 大气环境模型
    ASL::ISA cAtmosModel;

    // 六自由度运动学模型
    ASL::DOF6ECEF cDOFModel;

    // 自定义控制算法模型
    AutoPilot cPilotModel;

    // 数据记录文件流
    std::ofstream cStream;
};